package com.ferryc.commons.web;

import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.servlet.ModelAndView;

import com.ferryc.commons.utils.BeanUtil;
import com.ferryc.commons.utils.DateUtils;
import com.ferryc.commons.utils.StringEscapeEditor;
import com.ferryc.constant.GlobalConstant;
import com.ferryc.constant.ValidatorConstant;
import com.ferryc.modules.sys.entity.SysUser;
import com.ferryc.modules.sys.util.UserUtils;

/**
 * 
 * <pre>
 * 【类型】: BaseController <br/> 
 * 【作用】: 基础 controller. <br/>  
 * 【时间】：2017年5月19日 下午4:09:30 <br/> 
 * 【作者】：Ferry Chen <br/>
 * </pre>
 */
public abstract class BaseController {
	/**
	 * 日志对象
	 */
	protected Logger logger = LoggerFactory.getLogger(getClass());

	/**
	 * 
	 * 【方法名】 : init. <br/>
	 * 【作者】: Ferry Chen .<br/>
	 * 【时间】： 2017年5月23日 上午10:22:05 .<br/>
	 * 【参数】： .<br/>
	 * 
	 * @param binder
	 *            .<br/>
	 */
	@InitBinder
	public void initBinder(ServletRequestDataBinder binder) {
		/**
		 * 自动转换日期类型的字段格式
		 */
		binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
			@Override
			public void setAsText(String text) {
				try {
					setValue(DateUtils.parseDate(text, DateUtils.DATE_TIME));
				} catch (ParseException e) {
					logger.error(e.getMessage(), e);
				}
			}

		});

		/**
		 * 防止XSS攻击
		 */
		binder.registerCustomEditor(String.class, new StringEscapeEditor());
	}

	/**
	 * 获取当前登录用户对象
	 * 
	 * @return {ShiroUser}
	 */
	public SysUser getShiroUser() {
		return UserUtils.getShiroUser();
	}

	/**
	 * 获取当前登录用户id
	 * 
	 * @return {Long}
	 */
	public String getUserId() {
		return this.getShiroUser().getId();
	}

	/**
	 * 获取当前登录用户名
	 * 
	 * @return {String}
	 */
	public String getLoginName() {
		return this.getShiroUser().getLoginName();
	}

	/**
	 * 获取当前真实用户名
	 * 
	 * @return {String}
	 */
	public String getStaffName() {
		return this.getShiroUser().getRealName();
	}

	/**
	 * ajax失败
	 * 
	 * @param msg
	 *            失败的消息
	 * @return {Object}
	 */
	public Object renderError(String msg) {
		JsonResponse result = new JsonResponse();
		result.setMsg(msg);
		ModelAndView view = new ModelAndView();
		view.addObject(BeanUtil.toMap(result));
		return result;
	}

	/**
	 * ajax失败
	 * 
	 * @param obj
	 *            失败的对象
	 * @return {Object}
	 */
	public Object renderError(List<FieldError> list) {
		JsonResponse result = new JsonResponse();
		ModelAndView view = new ModelAndView();
		StringBuilder sb = new StringBuilder();
		Set<String> errorSet = new HashSet<String>();
		for (FieldError fieldError : list) {
			errorSet.add(fieldError.getDefaultMessage());
		}
		for (String type : errorSet) {
			sb.append(ValidatorConstant.getMessage(type));
			sb.append("\n");
		}
		result.setMsg(sb.toString());
		view.addObject(BeanUtil.toMap(result));
		return result;
	}

	/**
	 * ajax成功
	 * 
	 * @return {Object}
	 */
	public Object renderSuccess() {
		JsonResponse result = new JsonResponse();
		result.setSuccess(true);
		return result;
	}

	/**
	 * ajax成功
	 * 
	 * @param msg
	 *            消息
	 * @return {Object}
	 */
	public Object renderSuccess(String msg) {
		JsonResponse result = new JsonResponse();
		result.setSuccess(true);
		result.setMsg(msg);
		return result;
	}

	/**
	 * ajax成功
	 * 
	 * @param obj
	 *            成功时的对象
	 * @return {Object}
	 */
	public Object renderSuccess(Object obj) {
		JsonResponse result = new JsonResponse();
		result.setMsg(GlobalConstant.EXECU_SUCCESS);
		result.setSuccess(true);
		result.setObj(obj);
		return result;
	}

}
